Kwong Yan Chan

1458 经验值

大哥当然纤细了啊 。 跟着视频做的 并且写笔记了

Jelly, 你的评论 markdown解析是用哪个?代码部分渲染成黑色高亮,求指教 !!!!谢谢啦

01:Laravel Collection sum 求价格总和

  • 单独创建项目名称:collections,可以是空文件夹

  • 终端进入目录使用composer安装package

    • 终端执行命令,引入collection

      composer require illuminate/support
    • 终端执行命令,单独引入dump,dd等方法的package

      composer require pandeydip/dump-die
    • PS:基本上到达这一步就就可以单独实现视频中效果,如果是中途加入的这两个package,那么需要在终端执行命令composer dump-autoload,更新一下自动加载环境

  • 模拟创建index

<?php
//自行手打模拟视频测试数据
require __DIR__ . '/vendor/autoload.php';

$orders = [[
    'id'            =>      1,
    'user_id'       =>      1,
    'number'        =>      '13908080808',
    'status'        =>      0,
    'fee'           =>      10,
    'discount'      =>      44,
    'order_products'=> [
      ['order_id'=>1,'product_id'=>1,'param'=>'6寸','price'=>555.00,'product'=>['id'=>1,'name'=>'蛋糕名称','images'=>[]]],
      ['order_id'=>1,'product_id'=>1,'param'=>'7寸','price'=>333.00,'product'=>['id'=>1,'name'=>'蛋糕名称','images'=>[]]],
    ],
]];

$price = 0;

foreach( $orders as $order ){
    foreach( $order['order_products'] as $order_product ){
        $price += $order_product['price'];
    }
}
dump( $price );
  • 使用collection中提供的map方法,返回大数组中的子数组【打印出来的是一个索引的三维数组】

dump( collect( $orders )->map(function($order){
    return $order['order_products'];
}) );
  • 然后我们可以利用collection提供的flatten方法,将现在出现的数组直接变成items下的平级数组【其实打印出来就是一个索引的二维数组】

dump( collect( $orders )->map( function( $order ){
    return $order['order_products'];
} )->flatten(1) );
  • 继续使用map方法,然后返回$order['price'],那么打印出来的将会是纯price值的索引数组,这样就可以顺利计算价格的总和了

dump( collect( $orders )->map( function( $order ){
    return $order['order_products'];
} )->flatten(1)->map( function( $order ){
    return $order['price'];
} ) );
  • 使用sum方法计算出价钱的总和

dump( collect( $orders )->map( function( $order ){
    return $order['order_products'];
} )->flatten(1)->map( function( $order ){
    return $order['price'];
} )->sum() );
  • 上面描述步骤,算是使用的第一方案完成。代码体比两层foreach要大,下面记录视频中使用的第二种方案,更简洁

    • 使用flatMap方法,替换第一行的map

      collect( $orders )->flatMap( function( $order ){#代码体
    • 使用pluck方法传入要操作的key:price

      dump( collect( $orders )->flatMap( function( $order ){
          return $order['order_products'];
      } )->pluck('price')->sum() );
    • 当然如果不使用pluck方法的话可以直接传参到sum方法中

      dump( collect( $orders )->flatMap( function( $order ){
          return $order['order_products'];
      } )->sum('price') );
  • PS:上传两种方案操作起来都比较舒服。效果跟视频一致,第二种方式,真的是我有很爽的感觉。多谢Jelly分享。大大的赞

Hi,Jelly。我想请教一下,我用原生html标签做了表单那一块的页面胆码,但select标签,编辑页面怎么让他显示 getTagListAttribute没作用到页面上呢,

搞定了。。。。。。

02:实现收藏流程

  • 页面上增加收藏按钮,

@extends('app')
@section('content')
    {--chunk(3)这里实现的是每一行显示三个,就是把一个大数据分整3个一组的大二维数组--}
    @foreach( $lessons->chunk(3) as $row )
        <div class="row">
        @foreach( $row as $lesson )
            <article class="col-md-4">
                <h2>
                    { $lesson->title }
                </h2>
                <img src="{$lesson->image}" width="360" alt="">
                <div class="body">
                    <form action="/favorite" method="post">
                        { csrf_token() }
                        <input type="hidden" name="lesson_id" value="{ $lesson->id }">
                        <button type="submit" class="btn btn-primary">收藏</button>
                    </form>
                    {--下面增加--}

                    { $lesson->intro }
                </div>
            </article>
            @endforeach
        </div>
    @endforeach
    {!! $lessons->appends( ['type'=>'article'] )->render() !!}
    @stop
  • 终端命令生成控制器

php artisan make:controller FavoritesController
  • 注册路由

Route::resource( '/favorite','FavoritesController' );
  • 收藏控制器中store方法增加代码

public function store(Request $request)
{
    Auth::user()->favorites()->attach( $request->get( 'lesson_id' ) );

    return redirect()->back();
}
  • 到这一步测试,遇到三个问题,分别解决

    • 第一个问题,是页面token问题,我直接使用的是表单,并没有使用FORM那个插件,页面token使用错误,更正为:

      <form action="/favorite" method="post">
          { csrf_field() }
          <input type="hidden" name="lesson_id" value="{ $lesson->id }">
          <button type="submit" class="btn btn-primary">收藏</button>
      </form>
    • 第二个问题,传入控制器报错Auth没有找到,更改为:

      public function store(Request $request)
      {
      //Auth前面加反斜杠,问题解决,顺利入库
          \Auth::user()->favorites()->attach( $request->get( 'lesson_id' ) );
      
          return redirect()->back();
      }
    • 第三个问题,视频中提到的需要把created_atupdated_at也需要写入数据库,在用户模型方法中的favorites修改为:

      public function favorites()
      {
          return $this->belongsToMany(Lesson::class,'favorites')->withTimestamps();//后面再增加一个链式操作
      }
  • 增加收藏样式,由于没有使用字体图标,所以直接判断,使用bt样式进行变色

<form action="/favorite" method="post">
    { csrf_field() }
    <input type="hidden" name="lesson_id" value="{ $lesson->id }">
    <button type="submit" class="btn { in_array( $lesson->id,$favorites ) ? 'btn-success' : 'btn-primary' }">收藏</button>
</form>
  • 刷新页面,报错favorites变量没定义,路由处定义

$favorites = \App\Favorite::where( 'user_id',Auth::user()->id )
                            ->lists('lesson_id')->ToArray();
return view( 'lessons.index',compact('lessons','favorites'));
  • 定义好后,刷新页面,竟然报lessons未定义

    • 最后找不到解决办法,已经开始怀疑传值的compact有问题,开始怀疑一个对象集一个是数组集合,这样使用compact传值是不是有问题,后来并没有找到相关资料

    • 解决办法,我使用了with数组传值解决这一错误,

      Route::get('/lessons',function(){
      $lessons = \App\Lesson::latest()->paginate(15);#根据最近时间文章排序,取出每页15行数据
      $favorites = \App\Favorite::where( 'user_id',Auth::user()->id )
                              ->lists('lesson_id')->ToArray();
      //使用compact传两个参数错误,怀疑是一个对象一个只是数组出错[自我怀疑,没有搜索到资料证实]
      //使用with传值,无错误
          return view( 'lessons.index')->with(['lessons'=>$lessons,'favorites'=>$favorites]);
      });
  • 重新定义页面,增加判断,加入取消收藏表单,直接表单,没有使用视频中讲师的插件包

@extends('app')
@section('content')
    @foreach( $lessons->chunk(3) as $row )
        <div class="row">
        @foreach( $row as $lesson )
            <article class="col-md-4">
                <h2>
                    { $lesson->title }
                </h2>
                <img src="{$lesson->image}" width="360" alt="">
                <div class="body">
                    @if( in_array( $lesson->id,$favorites )  )
                        <form action="/favorite/{$lesson->id}" method="POST">
                            <input type="hidden" name="_method" value="DELETE">
                    @else
                        <form action="/favorite" method="post">
                    @endif
                            { csrf_field() }
                            <input type="hidden" name="lesson_id" value="{ $lesson->id }">
                            <button type="submit" class="{ in_array( $lesson->id,$favorites ) ? 'btn btn-success' : 'btn btn-primary' }">收藏</button>
                        </form>
                    { $lesson->intro }
                </div>
            </article>
            @endforeach
        </div>
    @endforeach
    {!! $lessons->render() !!}
    @stop
  • 控制器删除方法增加代码

public function destroy($id)
{
    \Auth::user()->favorites()->detach( $id );

    return redirect()->back();
}
  • 为了实现登录限制,所以

    • 登录后才能显示收藏按钮,页面增加判断

      @if( Auth::check() )
      //收藏表单html代码
      @endif
    • 控制器增加构造方法

      public function __construct()
      {
          $this->middleware('auth');
      }
    • 同事也需要修改路由判断

      Route::get('/lessons',function(){
          $lessons = \App\Lesson::latest()->paginate(15);#根据最近时间文章排序,取出每页15行数据
          //检查是否登录,跟视频会有出入,但效果实现一致
          if( Auth::check() ){
              $favorites = \App\Favorite::where( 'user_id',Auth::user()->id )
                  ->lists('lesson_id')->ToArray();
              //使用compact传两个参数错误,怀疑是一个对象一个只是数组出错
              //使用with传值,无错误
              return view( 'lessons.index')->with(['lessons'=>$lessons,'favorites'=>$favorites]);
          }else{
              return view( 'lessons.index')->with('lessons',$lessons);
      
          }
      });
  • 显示用户自己的收藏列表,具体就需要自己做列表显示了,这里忽略

public function index()
{
    \Auth::user()->favorites();
}
  • 最后测试收藏与取消收藏

    • 按钮颜色变换:成功

    • 数据库增减数据:成功

    • PS:嗯,整体效果跟视频一样

这个我也同意啊。 先粗略说一说 流程原理,然后在来敲一下代码 会理解更快,赞一个

代码逻辑体有点出入,但不管了 。至少最后效果是一致的

mac下homebrew 下在了spervisor,但是配置那个环境哪里不管用了,我先mark下流程笔记吧,后面再装个虚拟机环境运行下

不客气 。加油一起上路吧

做到这里,brew里面也有 supervisor这个包下载么?网络上搜索过好像没有,我只能暂时放弃直接在本机环境下载这个。